package com.cloud.service.api;

import com.cloud.service.dto.OrderDTO;
import com.cloud.service.response.ResultResponse;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 对外接口父类，提供常用的 curd 操作 和 查询操作
 *
 * @author qinxh
 * @date 2019/07/22
 */
@RequestMapping("/api/order")
public interface IOrderApi {

    /**
     * 新增
     *
     * @param t                             新增对象
     * @return  Long                        新增对象的主键
     */
    @PostMapping("/")
    ResultResponse<Long> post(@RequestBody OrderDTO t);

    /**
     * 删除
     *
     * @param id                            主键id
     * @return Integer
     */
    @DeleteMapping("/{id}/")
    ResultResponse<Integer> delete(@PathVariable("id") Long id);

    /**
     * 修改
     *
     * @param t                             修改对象
     * @return Integer
     */
    @PutMapping("/")
    ResultResponse<Integer> put(@RequestBody OrderDTO t);

    /**
     * 列表
     *
     * [不推荐]多参数的URL也可使用Map来构建。当目标URL参数非常多的时候，可使用这种方式简化Feign接口的编写
     * 主要是因为可读性不好，而且如果参数为空的时候会有一些问题，例如map.put("title", null); 会导致服务调用方（消费者服务）接收到的username是
     * "" ，而不是null。当然如果像本例中使用了对象与map之间的转换就不存在这个问题，但是性能下降严重
     *
     * 可以使用get0()方法的@SpringQueryMap 来实现，见方法get0()。注意：springboot对应的为2.1.x版本以上
     *
     * @param t                             过滤对象
     * @return T
     */
    @GetMapping("/")
    ResultResponse<List<OrderDTO>> get(@RequestParam Map<String,Object> map);

    /**
     *  SpringQueryMap注解解决feign的get传参方式
     * @param oder                          参数
     * @return T
     */
    @GetMapping("/get")
    ResultResponse<List<OrderDTO>>  get0(@SpringQueryMap OrderDTO oder);

    /**
     * 查看详情
     *
     * TIPS：Feign在使用@PathVariable注解时，必须指明字段对应的name
     *
     * @param id                            主键id
     * @return T
     */
    @GetMapping("/{id}/")
    ResultResponse<OrderDTO> details(@PathVariable("id") Long id);
}
